package de.g18.llmaa.gui.workspace;

import java.util.ArrayList;

import de.g18.llmaa.gui.IApp_Model;
import de.g18.llmaa.gui.workspace.internalFrame.Abstract_InternalFrame;
import de.g18.llmaa.gui.workspace.internalFrame.IInternalFrame_Beobachter;

/**
 * Das Workspace Model beihaltet alle sichtbaren Fenster es wird durch den
 * {@link Workspace_Crtl} verändert.
 * 
 * 
 * 
 * @author Gruppe LLMAA
 * 
 */
public class Workspace_Model implements IWorkspace_Model {

	private ArrayList<IWorkspace_Beobachter> list_Beobachter;

	private ArrayList<Abstract_InternalFrame> list_VisibleFrames;

	/**
	 * Konstruktor welcher das Workspace Model Instnaziiert.
	 */
	public Workspace_Model() {
		list_Beobachter = new ArrayList<IWorkspace_Beobachter>();
		list_VisibleFrames = new ArrayList<Abstract_InternalFrame>();
	}

	@Override
	public void aktualisiere(IApp_Model model) {
		list_VisibleFrames.clear();
		aktualisiereRemoveAll();

	}

	@Override
	public void registerBeobachter(IWorkspace_Beobachter beobachter) {
		list_Beobachter.add(beobachter);

	}

	/**
	 * Das neue Fenster registriert das Model als Beobachter. Um Informiert zu
	 * werden sollte sich das Fenster schließen.
	 */
	@Override
	public void addInternalFrame(Abstract_InternalFrame internalFrame) {


		list_VisibleFrames.add(internalFrame);
		refresh_NewInternalFrame(internalFrame);

	}

	/**
	 * Benachrichtigt alle Workspace Beobachter das es ein neues Fenster giebt.
	 */
	private void refresh_NewInternalFrame(Abstract_InternalFrame internalFrame) {
		for (IWorkspace_Beobachter beobachter : list_Beobachter) {
			beobachter.refresh_NewInternalFrame(internalFrame);
		}

	}

	/**
	 * Benachrichtigt die Beobachter das sie alle Fenster entfernen sollen.
	 */
	private void aktualisiereRemoveAll() {
		for (IWorkspace_Beobachter beobachter : list_Beobachter) {
			beobachter.refresh_All(this);
		}

	}

	@Override
	public ArrayList<Abstract_InternalFrame> getList_VisibleFrames() {
		return list_VisibleFrames;
	}



	/**
	 * Benachrichtigt alle Workspace Beobachter das es ein neues Fenster giebt.
	 */
	@Override
	public void removeInternalFrame(Abstract_InternalFrame internalFrame) {

		list_VisibleFrames.remove(internalFrame);
		refresh_removeInternalFrame(internalFrame);

	}

	/**
	 * Benachrichtigt alle Workspace Beobachter das es ein neues Fenster giebt.
	 */
	private void refresh_removeInternalFrame(
			Abstract_InternalFrame internalFrame) {
		for (IWorkspace_Beobachter beobachter : list_Beobachter) {
			beobachter.refresh_RemoveInternalFrame(internalFrame);
		}

	}

}
